{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Visualizing tweets and the Logistic Regression model\n",
    "\n",
    "**Objectives:** Visualize and interpret the logistic regression model\n",
    "\n",
    "**Steps:**\n",
    "* Plot tweets in a scatter plot using their positive and negative sums.\n",
    "* Plot the output of the logistic regression model in the same plot as a solid line"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Import the required libraries\n",
    "\n",
    "We will be using [*NLTK*](http://www.nltk.org/howto/twitter.html), an opensource NLP library, for collecting, handling, and processing Twitter data. In this lab, we will use the example dataset that comes alongside with NLTK. This dataset has been manually annotated and serves to establish baselines for models quickly. \n",
    "\n",
    "So, to start, let's import the required libraries. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import nltk                         # NLP toolbox\n",
    "from os import getcwd\n",
    "import pandas as pd                 # Library for Dataframes \n",
    "from nltk.corpus import twitter_samples \n",
    "import matplotlib.pyplot as plt     # Library for visualization\n",
    "import numpy as np                  # Library for math functions\n",
    "\n",
    "from utils import process_tweet, build_freqs # Our functions for NLP"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Load the NLTK sample dataset\n",
    "\n",
    "To complete this lab, you need the sample dataset of the previous lab. Here, we assume the files are already available, and we only need to load into Python lists."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Number of tweets:  8000\n"
     ]
    }
   ],
   "source": [
    "# select the set of positive and negative tweets\n",
    "all_positive_tweets = twitter_samples.strings('positive_tweets.json')\n",
    "all_negative_tweets = twitter_samples.strings('negative_tweets.json')\n",
    "\n",
    "tweets = all_positive_tweets + all_negative_tweets ## Concatenate the lists. \n",
    "labels = np.append(np.ones((len(all_positive_tweets),1)), np.zeros((len(all_negative_tweets),1)), axis = 0)\n",
    "\n",
    "# split the data into two pieces, one for training and one for testing (validation set) \n",
    "train_pos  = all_positive_tweets[:4000]\n",
    "train_neg  = all_negative_tweets[:4000]\n",
    "\n",
    "train_x = train_pos + train_neg \n",
    "\n",
    "print(\"Number of tweets: \", len(train_x))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Load the extracted features\n",
    "\n",
    "Part of this week's assignment is the creation of the numerical features needed for the Logistic regression model. In order not to interfere with it, we have previously calculated and stored these features in a CSV file for the entire training set.\n",
    "\n",
    "So, please load these features created for the tweets sample. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": "   bias  positive  negative  sentiment\n0   1.0    3020.0      61.0        1.0\n1   1.0    3573.0     444.0        1.0\n2   1.0    3005.0     115.0        1.0\n3   1.0    2862.0       4.0        1.0\n4   1.0    3119.0     225.0        1.0\n5   1.0    2955.0     119.0        1.0\n6   1.0    3934.0     538.0        1.0\n7   1.0    3162.0     276.0        1.0\n8   1.0     628.0     189.0        1.0\n9   1.0     264.0     112.0        1.0",
      "text/html": "<div>\n<style scoped>\n    .dataframe tbody tr th:only-of-type {\n        vertical-align: middle;\n    }\n\n    .dataframe tbody tr th {\n        vertical-align: top;\n    }\n\n    .dataframe thead th {\n        text-align: right;\n    }\n</style>\n<table border=\"1\" class=\"dataframe\">\n  <thead>\n    <tr style=\"text-align: right;\">\n      <th></th>\n      <th>bias</th>\n      <th>positive</th>\n      <th>negative</th>\n      <th>sentiment</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th>0</th>\n      <td>1.0</td>\n      <td>3020.0</td>\n      <td>61.0</td>\n      <td>1.0</td>\n    </tr>\n    <tr>\n      <th>1</th>\n      <td>1.0</td>\n      <td>3573.0</td>\n      <td>444.0</td>\n      <td>1.0</td>\n    </tr>\n    <tr>\n      <th>2</th>\n      <td>1.0</td>\n      <td>3005.0</td>\n      <td>115.0</td>\n      <td>1.0</td>\n    </tr>\n    <tr>\n      <th>3</th>\n      <td>1.0</td>\n      <td>2862.0</td>\n      <td>4.0</td>\n      <td>1.0</td>\n    </tr>\n    <tr>\n      <th>4</th>\n      <td>1.0</td>\n      <td>3119.0</td>\n      <td>225.0</td>\n      <td>1.0</td>\n    </tr>\n    <tr>\n      <th>5</th>\n      <td>1.0</td>\n      <td>2955.0</td>\n      <td>119.0</td>\n      <td>1.0</td>\n    </tr>\n    <tr>\n      <th>6</th>\n      <td>1.0</td>\n      <td>3934.0</td>\n      <td>538.0</td>\n      <td>1.0</td>\n    </tr>\n    <tr>\n      <th>7</th>\n      <td>1.0</td>\n      <td>3162.0</td>\n      <td>276.0</td>\n      <td>1.0</td>\n    </tr>\n    <tr>\n      <th>8</th>\n      <td>1.0</td>\n      <td>628.0</td>\n      <td>189.0</td>\n      <td>1.0</td>\n    </tr>\n    <tr>\n      <th>9</th>\n      <td>1.0</td>\n      <td>264.0</td>\n      <td>112.0</td>\n      <td>1.0</td>\n    </tr>\n  </tbody>\n</table>\n</div>"
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data = pd.read_csv('logistic_features.csv'); # Load a 3 columns csv file using pandas function\n",
    "data.head(10) # Print the first three data entries"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now let us get rid of the data frame to keep only Numpy arrays."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(8000, 3)\n",
      "[[1.000e+00 3.020e+03 6.100e+01]\n",
      " [1.000e+00 3.573e+03 4.440e+02]\n",
      " [1.000e+00 3.005e+03 1.150e+02]\n",
      " ...\n",
      " [1.000e+00 1.440e+02 7.830e+02]\n",
      " [1.000e+00 2.050e+02 3.890e+03]\n",
      " [1.000e+00 1.890e+02 3.974e+03]]\n"
     ]
    }
   ],
   "source": [
    "# Each feature is labeled as bias, positive and negative\n",
    "X = data[['bias', 'positive', 'negative']].values # Get only the numerical values of the dataframe\n",
    "Y = data['sentiment'].values; # Put in Y the corresponding labels or sentiments\n",
    "\n",
    "print(X.shape) # Print the shape of the X part\n",
    "print(X) # Print some rows of X"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Load a pretrained Logistic Regression model\n",
    "\n",
    "In the same way, as part of this week's assignment, a Logistic regression model must be trained. The next cell contains the resulting model from such training. Notice that a list of 3 numeric values represents the whole model, that we have called _theta_ $\\theta$."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "theta = [7e-08, 0.0005239, -0.00055517]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Plot the samples in a scatter plot\n",
    "\n",
    "The vector theta represents a plane that split our feature space into two parts. Samples located over that plane are considered positive, and samples located under that plane are considered negative. Remember that we have a 3D feature space, i.e., each tweet is represented as a vector comprised of three values: `[bias, positive_sum, negative_sum]`, always having `bias = 1`. \n",
    "\n",
    "If we ignore the bias term, we can plot each tweet in a cartesian plane, using `positive_sum` and `negative_sum`. In the cell below, we do precisely this. Additionally, we color each tweet, depending on its class. Positive tweets will be green and negative tweets will be red."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": "Text(0, 0.5, 'Negative')"
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "text/plain": "<Figure size 576x576 with 1 Axes>",
      "image/png": "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\n"
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Plot the samples using columns 1 and 2 of the matrix\n",
    "fig, ax = plt.subplots(figsize = (8, 8))\n",
    "\n",
    "colors = ['red', 'green']\n",
    "\n",
    "# Color based on the sentiment Y\n",
    "ax.scatter(X[:,1], X[:,2], c=[colors[int(k)] for k in Y], s = 0.1)  # Plot a dot for each pair of words\n",
    "plt.xlabel(\"Positive\")\n",
    "plt.ylabel(\"Negative\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "From the plot, it is evident that the features that we have chosen to represent tweets as numerical vectors allow an almost perfect separation between positive and negative tweets. So you can expect a very high accuracy for this model! \n",
    "\n",
    "## Plot the model alongside the data\n",
    "\n",
    "We will draw a gray line to show the cutoff between the positive and negative regions. In other words, the gray line marks the line where $$ z = \\theta * x = 0.$$\n",
    "To draw this line, we have to solve the above equation in terms of one of the independent variables.\n",
    "\n",
    "$$ z = \\theta * x = 0$$\n",
    "$$ x = [1, pos, neg] $$\n",
    "$$ z(\\theta, x) = \\theta_0+ \\theta_1 * pos + \\theta_2 * neg = 0 $$\n",
    "$$ neg = (-\\theta_0 - \\theta_1 * pos) / \\theta_2 $$\n",
    "\n",
    "The red and green lines that point in the direction of the corresponding sentiment are calculated using a perpendicular line to the separation line calculated in the previous equations(neg function). It must point in the same direction as the derivative of the Logit function, but the magnitude may differ. It is only for a visual representation of the model. \n",
    "\n",
    "$$direction = pos * \\theta_2 / \\theta_1$$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Equation for the separation plane\n",
    "# It give a value in the negative axe as a function of a positive value\n",
    "# f(pos, neg, W) = w0 + w1 * pos + w2 * neg = 0\n",
    "# s(pos, W) = (w0 - w1 * pos) / w2\n",
    "def neg(theta, pos):\n",
    "    return (-theta[0] - pos * theta[1]) / theta[2]\n",
    "\n",
    "# Equation for the direction of the sentiments change\n",
    "# We don't care about the magnitude of the change. We are only interested \n",
    "# in the direction. So this direction is just a perpendicular function to the \n",
    "# separation plane\n",
    "# df(pos, W) = pos * w2 / w1\n",
    "def direction(theta, pos):\n",
    "    return    pos * theta[2] / theta[1]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The green line in the chart points in the direction where z > 0 and the red line points in the direction where z < 0. The direction of these lines are given by the weights $\\theta_1$ and $\\theta_2$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": "<Figure size 576x576 with 1 Axes>",
      "image/png": "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\n"
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Plot the samples using columns 1 and 2 of the matrix\n",
    "fig, ax = plt.subplots(figsize = (8, 8))\n",
    "\n",
    "colors = ['red', 'green']\n",
    "\n",
    "# Color base on the sentiment Y\n",
    "ax.scatter(X[:,1], X[:,2], c=[colors[int(k)] for k in Y], s = 0.1)  # Plot a dot for each pair of words\n",
    "plt.xlabel(\"Positive\")\n",
    "plt.ylabel(\"Negative\")\n",
    "\n",
    "# Now lets represent the logistic regression model in this chart. \n",
    "maxpos = np.max(X[:,1])\n",
    "\n",
    "offset = 5000 # The pos value for the direction vectors origin\n",
    "\n",
    "# Plot a gray line that divides the 2 areas.\n",
    "ax.plot([0,  maxpos], [neg(theta, 0),   neg(theta, maxpos)], color = 'gray') \n",
    "\n",
    "# Plot a green line pointing to the positive direction\n",
    "ax.arrow(offset, neg(theta, offset), offset, direction(theta, offset), head_width=500, head_length=500, fc='g', ec='g')\n",
    "# Plot a red line pointing to the negative direction\n",
    "ax.arrow(offset, neg(theta, offset), -offset, -direction(theta, offset), head_width=500, head_length=500, fc='r', ec='r')\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Note that more critical than the Logistic regression itself, are the features extracted from tweets that allow getting the right results in this exercise.**\n",
    "\n",
    "That is all, folks. Hopefully, now you understand better what the Logistic regression model represents, and why it works that well for this specific problem. "
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "name": "pycharm-dbe0cc3b",
   "language": "python",
   "display_name": "PyCharm (News)"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.8"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}